package br.cnpq.webflowah.beans;

import java.io.Serializable;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.mindswap.owl.OWLKnowledgeBase;
import org.mindswap.owl.OWLOntology;
import org.mindswap.owls.process.Process;

import br.cnpq.webflowah.ontologia.Repositorio;

public class Operacao implements Serializable {

	private static final long serialVersionUID = 1L;
	
	private URI uri = null;
	
	private List<URI> entradas = new ArrayList<URI>();
		
	private Map<URI, URI> entradasMap = new HashMap<URI, URI>();
	
	private List<URI> precondicoes = new ArrayList<URI>();

	private Map<URI, URI> precondicoesMap = new HashMap<URI, URI>();

	private List<URI> saidas = new ArrayList<URI>();
	
	private Map<URI, URI> saidasMap = new HashMap<URI, URI>();
	
	private List<URI> efeitos = new ArrayList<URI>();

	private Map<URI, URI> efeitosMap = new HashMap<URI, URI>();

	private Objetivo objetivo;
	
	private String servico;
	
	public Process getProcess() throws Exception {		
		OWLKnowledgeBase kb = Repositorio.newInstance(true);
		String str = uri.toString();
		OWLOntology ont = kb.read(str.substring(0, str.lastIndexOf("#")));
		return ont.getProcess(uri);		
	}
	
	public List<URI> getEntradas() {
		return entradas;
	}

	public void addEntrada(URI uri, URI input) {
		this.entradas.add(uri);
		this.entradasMap.put(input, uri);
	}
	
	public boolean consomeEntrada(URI uri) {
		return entradas.contains(uri);
	}

	public URI getEntrada(URI key) {
		return entradasMap.get(key);
	}

	public List<URI> getPrecondicoes() {
		return precondicoes;
	}

	public void addPrecondicao(URI uri, URI input) {
		this.precondicoes.add(uri);
		this.precondicoesMap.put(input, uri);
	}
	
	public boolean consomePrecondicao(URI uri) {
		return precondicoes.contains(uri);
	}

	public URI getPrecondicao(URI key) {
		return precondicoesMap.get(key);
	}
		
	public List<URI> getSaidas() {
		return saidas;
	}

	public void addSaida(URI uri, URI output) {
		this.saidas.add(uri);
		this.saidasMap.put(output, uri);
	}
	
	public boolean produzSaida(URI uri) {
		return saidas.contains(uri);
	}

	public URI getSaida(URI key) {
		return saidasMap.get(key);
	}

	public List<URI> getEfeitos() {
		return efeitos;
	}

	public void addEfeito(URI uri, URI output) {
		this.efeitos.add(uri);
		this.efeitosMap.put(output, uri);
	}
	
	public boolean produzEfeito(URI uri) {
		return efeitos.contains(uri);
	}

	public URI getEfeito(URI key) {
		return efeitosMap.get(key);
	}
	
	public URI getURI() {
		return uri;
	}

	public void setURI(URI uri) {
		this.uri = uri;
	}
		
	@Override
	public boolean equals(Object arg0) {
		Operacao operacao = (Operacao) arg0;		
		return this.uri.equals(operacao.getURI());
	}

	@Override
	public String toString() {
		return this.uri.toString();
	}

	public Objetivo getObjetivo() {
		return objetivo;
	}

	public void setObjetivo(Objetivo objetivo) {
		this.objetivo = objetivo;
	}

	public String getServico() {
		return servico;
	}

	public void setServico(String servico) {
		this.servico = servico;
	}

}
